package com.colin.app.service;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;

import com.colin.app.MyAIDLService;
import com.colin.library.help.LogHelp;

/**
 * 在一个进程中访问到了另外一个进程中的方法。不过你也可以看出，目前的跨进程通信其实并没有什么实质上的作用，
 * 因为这只是在一个Activity里调用了同一个应用程序的Service里的方法。
 * 而跨进程通信的真正意义是为了让一个应用程序去访问另一个应用程序中的Service，
 * 以实现共享Service的功能。那么下面我们自然要学习一下，如何才能在其它的应用程序中调用到MyService里的方法。
 * 必须使用到隐式Intent了。现在修改AndroidManifest.xml中的代码，给MyService加上一个action
 *    <action android:name="com.colin.app.service.RemoteService"/>
 *
 * 不同的进程之间传递数据，Android对这类数据的格式支持是非常有限的，基本上只能传递Java的基本数据类型、字符串、List或Map等。
 * 那么如果我想传递一个自定义的类该怎么办呢？这就必须要让这个类去实现Parcelable接口，并且要给这个类也定义一个同名的AIDL文件
 */
public class RemoteService extends Service {

    public RemoteService() {
    }

    /**
     * onBind()方法用于和Activity建立关联的
     *
     * @param intent
     * @return
     */
    @Override
    public IBinder onBind(Intent intent) {
        return remoteBinder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        LogHelp.d("DemoService thread id is " + Thread.currentThread().getId());
        LogHelp.d("onCreate()");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        LogHelp.d("onStartCommand()");
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 开始执行后台任务
            }
        }).start();
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        LogHelp.d("onDestroy()");
    }

    //    /**
//     * MyBinder类继承自Binder类，然后在MyBinder中添加了一个startDownload()方法用于在后台执行任务，
//     * 做个测试:打印了一行日志
//     */
//    public class RemoteBinder extends Binder {
//        public void startDownload() {
//            new Thread(new Runnable() {
//                @Override
//                public void run() {
//                    // 执行具体的下载任务
//                }
//            }).start();
//            LogHelp.d("startDownload()");
//            // 执行具体的下载任务
//        }
//
//    }
//    /**
//     * MyAIDLService.Stub进行了实现，重写里了toUpperCase()和plus()这两个方法。
//     * 这两个方法的作用分别是将一个字符串全部转换成大写格式，以及将两个传入的整数进行相加。
//     * 然后在onBind()方法中将MyAIDLService.Stub的实现返回。这里为什么可以这样写呢？
//     * 因为Stub其实就是Binder的子类，所以在onBind()方法中可以直接返回Stub的实现
//     */
    MyAIDLService.Stub remoteBinder = new MyAIDLService.Stub() {
        @Override
        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {

        }

        @Override
        public int plus(int a, int b) throws RemoteException {
            return a + b;
        }

        @Override
        public String toUpperCase(String str) throws RemoteException {
            if (str != null) {
                return str.toUpperCase();
            }
            return null;
        }
    };
}
